Feat/marketing redesign and llm seo#137
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (27)
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
There was a problem hiding this comment.
Pull request overview
This PR updates the Refactron marketing site to reflect the new positioning (deterministic refactoring + verification, now with npm distribution) and adds SEO/LLM discovery assets to improve indexing and AI retrieval.
Changes:
- Adds new landing sections (Comparison, Quickstart, Testimonials) and redesigns existing sections (WhatWeDo, About) for the new narrative.
- Improves SEO by adding per-post SEO + BlogPosting JSON-LD, homepage FAQ JSON-LD, and new
/researchroute plus sitemap/prerender updates. - Introduces
llms.txtandllms-full.txtplus Vercel header rules and robots updates to support LLM indexing.
Reviewed changes
Copilot reviewed 26 out of 28 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| vercel.json | Adds cache + content-type headers for llms.txt and llms-full.txt; minor redirect formatting. |
| tailwind.config.js | Adds new marquee/pulse animations and keyframes used by the redesigned sections. |
| src/data/posts.ts | Adds a new release blog post describing npm distribution and new capabilities. |
| src/components/WhatWeDoSection.tsx | Replaces modal/card UI with new bento layout + richer visuals and reduced-motion handling. |
| src/components/ui/safari-mockup.tsx | Removes unused Safari mockup component (file deleted). |
| src/components/ui/card-swap.tsx | Removes unused GSAP card swap component (file deleted). |
| src/components/TestimonialsSection.tsx | Adds a new testimonials marquee section with reduced-motion fallback. |
| src/components/ResearchPage.tsx | Adds a new /research page (currently “private/coming soon” messaging) with SEO metadata. |
| src/components/QuickstartSection.tsx | Adds a new quickstart section with accessible tabs and code-like command listing. |
| src/components/PricingSection.tsx | Updates plan copy to match deterministic/verification-focused messaging (removes LLM language). |
| src/components/PageLayout.tsx | Adds announcement banner integration and adjusts layout padding when banner is visible. |
| src/components/NumericAsciiBackdrop.tsx | Adds a canvas-based numeric ASCII background used by Quickstart. |
| src/components/NavigationBar.tsx | Adds bannerVisible prop to offset navbar when the announcement banner is shown. |
| src/components/HeroSection.tsx | Adds auto-cycling pip/npm install CTA with copy support and animation transitions. |
| src/components/Footer.tsx | Updates footer links (adds Research/Status/Quickstart/etc.) and removes cookie-settings entry point. |
| src/components/FAQSection.tsx | Keeps answers in the DOM for SEO while animating height/opacity; adds ARIA ids and defaults first open. |
| src/components/CookieManager.tsx | Removes outdated footer-link comment after cookie-settings entry point was removed. |
| src/components/ComparisonSection.tsx | Adds a new comparison matrix section and link to /research. |
| src/components/BlogPostPage.tsx | Adds per-post SEO + BlogPosting JSON-LD injection; adds “Release/package” icon mapping. |
| src/components/BlogPage.tsx | Adds “Release/package” icon mapping for blog listings. |
| src/components/AnnouncementBanner.tsx | Adds dismissible announcement banner with sessionStorage persistence and internal/external navigation. |
| src/components/AboutPage.tsx | Major redesign with new founder story, visuals, and multiple generated ASCII backdrops. |
| src/App.tsx | Adds new landing sections, adds /research route, and composes the new homepage order. |
| scripts/prerender.js | Adds /research to the prerendered routes set. |
| scripts/generate-sitemap.js | Adds /research to the generated sitemap route list. |
| scripts/generate-llms-full.js | Adds a new prebuild script to generate public/llms-full.txt from posts + FAQ content. |
| public/sitemap.xml | Updates sitemap output to include /research and the new blog post. |
| public/robots.txt | Expands crawler directives; adds LLM/training bot allowlist and adds Sitemap: .../llms.txt. |
| public/llms.txt | Adds a curated LLM index document describing site URLs and key product facts. |
| public/llms-full.txt | Adds a generated long-form LLM document containing curated overview + FAQs + full blog content. |
| public/index.html | Updates meta descriptions/keywords and adds FAQPage JSON-LD + expands SoftwareApplication JSON-LD. |
| package.json | Extends prebuild to also run scripts/generate-llms-full.js. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| const slugRx = /slug:\s*['"]([^'"]+)['"]/g; | ||
| const titleRx = /title:\s*["'](.+?)["'],/g; | ||
| const summaryRx = /summary:\s*\n?\s*['"]([\s\S]*?)['"],\n/g; | ||
| const bodyRx = /body:\s*`([\s\S]*?)`,?\n\s*(?:featured|}|\])/g; | ||
| const publishedRx = /publishedAt:\s*['"]([^'"]+)['"]/g; | ||
|
|
||
| const slugs = [...region.matchAll(slugRx)].map(m => m[1]); | ||
| const titles = [...region.matchAll(titleRx)].map(m => m[1]); | ||
| const summaries = [...region.matchAll(summaryRx)].map(m => m[1]); | ||
| const bodies = [...region.matchAll(bodyRx)].map(m => m[1]); |
| const ld = { | ||
| '@context': 'https://schema.org', | ||
| '@type': 'BlogPosting', | ||
| headline: post.title, | ||
| description: post.summary, | ||
| datePublished: new Date(post.publishedAt).toISOString(), |
| {/* Company */} | ||
| <div> | ||
| <h4 className="text-sm font-semibold text-white mb-4">Company</h4> | ||
| <ul className="space-y-3"> | ||
| <li> | ||
| <a | ||
| href="/about" | ||
| className="text-neutral-400 hover:text-white text-sm transition-colors" | ||
| > | ||
| About | ||
| </a> | ||
| </li> | ||
| <li> | ||
| <a | ||
| href="/security" | ||
| className="text-neutral-400 hover:text-white text-sm transition-colors" | ||
| > | ||
| Security | ||
| </a> | ||
| </li> | ||
| <li> | ||
| <a | ||
| href="/status" | ||
| className="text-neutral-400 hover:text-white text-sm transition-colors" | ||
| > | ||
| Status | ||
| </a> | ||
| </li> | ||
| <li> | ||
| <a | ||
| href="https://cal.com/omsherikar/queries-refactron" | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| href="/privacy-policy" | ||
| className="text-neutral-400 hover:text-white text-sm transition-colors" | ||
| > | ||
| Contact | ||
| Privacy | ||
| </a> | ||
| </li> | ||
| <li> | ||
| <a | ||
| href="/privacy-policy" | ||
| href="/terms-of-service" | ||
| className="text-neutral-400 hover:text-white text-sm transition-colors" | ||
| > | ||
| Privacy | ||
| Terms | ||
| </a> | ||
| </li> |
|
|
||
| # ─── Sitemaps + LLM index ──────────────────────────────────────── | ||
| Sitemap: https://refactron.dev/sitemap.xml | ||
| Sitemap: https://refactron.dev/llms.txt |
| @@ -1 +1 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://refactron.dev/</loc><changefreq>weekly</changefreq><priority>1.0</priority></url><url><loc>https://refactron.dev/blog</loc><changefreq>weekly</changefreq><priority>0.9</priority></url><url><loc>https://refactron.dev/about</loc><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://refactron.dev/changelog</loc><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://refactron.dev/security</loc><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://refactron.dev/privacy-policy</loc><changefreq>yearly</changefreq><priority>0.3</priority></url><url><loc>https://refactron.dev/terms-of-service</loc><changefreq>yearly</changefreq><priority>0.3</priority></url><url><loc>https://refactron.dev/blog/i-ran-refactron-on-djangos-codebase</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-vs-cursor-vs-codeant</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/why-we-built-verification-engine-first</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/legacy-code-ai-refactoring</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-on-requests-library</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/real-cost-of-not-refactoring</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-on-fastapi</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/how-to-safely-refactor-python-code-you-didnt-write</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/why-refactron-runs-locally</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-is-now-a-nodejs-package</loc><changefreq>monthly</changefreq><priority>0.8</priority></url></urlset> No newline at end of file | |||
| <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://refactron.dev/</loc><changefreq>weekly</changefreq><priority>1.0</priority></url><url><loc>https://refactron.dev/blog</loc><changefreq>weekly</changefreq><priority>0.9</priority></url><url><loc>https://refactron.dev/about</loc><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://refactron.dev/changelog</loc><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://refactron.dev/security</loc><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://refactron.dev/research</loc><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://refactron.dev/privacy-policy</loc><changefreq>yearly</changefreq><priority>0.3</priority></url><url><loc>https://refactron.dev/terms-of-service</loc><changefreq>yearly</changefreq><priority>0.3</priority></url><url><loc>https://refactron.dev/blog/i-ran-refactron-on-djangos-codebase</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-vs-cursor-vs-codeant</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/why-we-built-verification-engine-first</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/legacy-code-ai-refactoring</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-on-requests-library</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/real-cost-of-not-refactoring</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-on-fastapi</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/how-to-safely-refactor-python-code-you-didnt-write</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/why-refactron-runs-locally</loc><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>https://refactron.dev/blog/refactron-is-now-a-nodejs-package</loc><changefreq>monthly</changefreq><priority>0.8</priority></url></urlset> | |||
| to="/research" | ||
| className="text-[11px] font-mono text-neutral-500 hover:text-neutral-400 tracking-wide underline underline-offset-[5px] decoration-neutral-700/80 hover:decoration-neutral-500 transition-colors" | ||
| > | ||
| Read the full research paper → |
| - [Refactron — landing](https://refactron.dev/): Hero, pipeline, comparison with Cursor / SonarQube / CodeAnt, quickstart, FAQ. | ||
| - [About Refactron](https://refactron.dev/about): The origin story (the hackathon moment), the founder, and the five safety constraints (read-only first, human-in-the-loop, verification, incremental steps, rollback). | ||
| - [Security](https://refactron.dev/security): Privacy practices, encryption, local-first architecture, responsible-disclosure policy. | ||
| - [Research](https://refactron.dev/research): The technical paper on deterministic refactoring + behavior-preservation. |
Rebuild the marketing-site visual language around a single monochrome + CSS-3D isometric system shared across sections. RefactoringWorkflowSection: merge the pipeline and dependency-graph panels into one card driven by a shared 4-stage cycle (analyze → refactor → verify → document). Force-directed canvas graph with sequential scan, edge probes, sonar sweep, targeting reticle, trail polyline, and stage-specific overlays (diff text, verify wave + checkmarks, drifting doc glyphs). Pure white accent only. WhatWeDoSection: monochrome bento (12 / 7 + 5). Isometric gate slabs replace the colored verification bars. Mono diff snippet replaces rose/emerald colored diff. Control flow rebuilt with isometric step nodes and a dashed rollback hook. New CSS primitives: RingGauge (conic-gradient dial), RiskMeter (segmented bar), ChevronArrow + ShieldGlyph (clip-path), FileTab (editor tab). New sections: ComparisonSection, QuickstartSection, TestimonialsSection, ResearchPage, NumericAsciiBackdrop. Refresh AboutPage, Footer, FAQSection, PricingSection. Remove unused ui/card-swap and ui/safari-mockup. Tailwind theme tweaks, sitemap + prerender script updates. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…p teal in Testimonials - ComparisonSection: match the standard card chrome (border-white/[0.06] bg-white/[0.012], no shadow, no teal glow), add the static dot-grid backdrop, replace Lucide check/X with monochrome dot-vs-dash marks, give the Refactron column a continuous vertical accent via border-l-white/[0.22]. - QuickstartSection: same chrome alignment, dot-grid backdrop, emerald command text -> white, '$' prompt -> faint chevron. - TestimonialsSection: keep the cream paper inversion as the intentional editorial beat; strip the lone teal radial in the backdrop and teal chart bars to neutral grays (only color we've removed everywhere else on the site). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Hero leads with "Every codebase has code nobody wants to touch" (no eyebrow above the headline); a two-line subhead carries the promise, signed off with a mono founder signature. - Founder card restructured so "the moment" (the hackathon scene that started Refactron) is the lede, not a buried paragraph. Identity block is now two mono fields (role / building); receipts row and X + LinkedIn affordances kept. - Portrait chrome simplified: single ring + soft shadow, no more dual outer glow + ring stack. - Card chrome unified with Workflow / WhatWeDo / Comparison / Quickstart: border-white/[0.06] + bg-white/[0.012] + static dot-grid backdrop. Dropped panelSurface + panelInnerGlow. - Severity badges in the health digest stripped of rose/amber/sky colors. SeverityTag is a single monochrome chip where dot alpha and label brightness encode severity (ERR / WARN / INFO). - Approach step badges flattened to small rounded squares with two-digit padded numbers; ListMarker hairline dash replaces the colored check-in-circle bullets. - "Why I'm Building" rebuilt as a letter close — A LETTER eyebrow, short pull-quote with white emphasis on the key phrases, hairline rule + mono signature. Dropped the giant decorative quote mark. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The three middle sections were the weakest beat on the page — each one was a generic card with a text list inside. Replacing each with a visual register a developer actually recognizes: - The Problem -> a real terminal-output card. macOS-style dot strip, prompt, command, ✓ scanned line, then five log lines with bracketed [ERR ] / [WARN] / [INFO] tokens whose brightness encodes severity. Footer shows a count breakdown. SeverityToken inline component replaces the boxed SeverityTag. - My Approach -> CI/pipeline visual. Top: a 5-dot horizontal overview where dot brightness fades through the pipeline. Below: vertical pipeline with a gradient connector line threading the step circles, each step as a numbered black circle (01..05) with title + detail. - What Safe Means -> each card now leads with a per-constraint SVG diagram (SafetyVisual): READ|WRITE state for 01, the PROPOSED -> APPROVED flow with a check for 02, a stacked syntax/tests/invariants pass list for 03, five progress nodes decreasing in brightness for 04, an UNDO loop arrow from "now" back to "prev" for 05. Outcome label is now a chip; outcome body bottom-anchored so card heights look planned. All monochrome. All static after mount. The static dot-grid backdrop on each card stays. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hero illustration is now a tactile, dark-glass "REFACTRON ·
ENGINE" tile — built in CSS, not SVG hairlines, so it actually
reads as a piece of hardware rather than a blueprint drawing.
Surface treatment:
- Aspect-square rounded-[28px] tile, soft top-down satin
gradient + radial highlight at the top, inset upper rim
bright + lower rim shadow, large drop shadow underneath
for elevation. Subtle outer halo (white at very low alpha).
- A 1px top-edge highlight hairline across the top inside the
tile sells the "milled edge" look.
Composition inside the tile:
- Top-right: a small monochrome "R" sigil glyph.
- Centre: a 9x9 chip-die dot matrix. Dot alpha falls off
radially from the centre; the centre dot pulses gently
via a single CSS keyframe (rfn-die-pulse, ~2.6s loop) —
"powered on" feel. A faint radial halo sits behind the
matrix.
- Bottom-left: REFACTRON / ENGINE in mono.
- Bottom-right: a row of 5 status LEDs; the leftmost shares
the same pulse animation as the core ("active" state).
Periphery (outside the tile):
- FIG · 01 at the top-left.
- DETERMINISTIC · V0.5 at the bottom-right.
- At xl+, a vertical rail label running down the right edge:
ANALYZE · REFACTOR · VERIFY · DOCUMENT.
Removed: HeroEngineSchematic + Gear + GearProps (SVG line-art
version). Replaced with HeroChipModule + ChipCoreDie. No iso
primitives. Pure white at varied alpha on near-black surfaces.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaced the flat-SVG SafetyVisual line drawings with five CSS
glassmorphic widgets — same satin / inset-shadow / soft-glow
language as the hero chip module, scaled down. Each one is a
small "control surface" element with one iconic affordance.
Shared base recipes (defined once, reused per card):
- glassBase — neutral satin tile with inset rim shadow.
- glassActive — brighter top-down gradient, raised rim,
outer ambient glow.
- glassDim — dim background with dashed border (proposed /
inactive state).
01 SafetyReadOnly — two pills: an active READ glass pill (raised,
glowing dot) and a dim WRITE pill with a horizontal strike
across it; dashed hairline between them.
02 SafetyApprove — stacked PROPOSED → APPROVED mini-cards.
PROPOSED uses the dim/dashed glass style. APPROVED uses the
active/raised glass style and carries a check glyph.
03 SafetyVerify — a tile with three glowing LED rows (syntax /
tests / invariants), each with a soft white shadow and a
right-aligned "PASS" tag.
04 SafetyIncremental — five small "key cap" tiles in a row.
Each has its own subtle satin gradient + rim shadow.
Active key is brighter with an ambient glow; the rest fade.
Two-digit padded numbers inside (01..05).
05 SafetyRollback — three round glass buttons in a row over a
dashed arc trail: a dim "prev" indicator on the left, a large
central rollback button with a radial-gradient surface and an
embossed undo arrow, and a glowing "now" indicator on the
right.
Same monochrome palette. No iso primitives. Pure CSS — no extra
SVG hairline diagrams.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The inline SVG I hand-rolled for the central rollback button was mis-pathed (the arrow-hook and the arc didn't visually join up, so it read as a backwards "C" with a stray tick rather than the universal counter-clockwise undo glyph). Swapped it for Lucide's `RotateCcw` — the canonical rollback / undo affordance. Stroke width tuned slightly heavier (1.75) so it reads cleanly against the dark glass disc. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Built a deliberately beautiful ASCII pattern backdrop and applied
it to the two sections that benefit most from atmospheric mood:
the hero (the first impression) and the "A letter" close (the
emotional payoff).
Implementation:
- buildAsciiPattern() — deterministic generator. Walks an
NxM grid of cells; for each, picks SPACE or a character from
a passed-in charset using a seeded LCG. Per-cell placement
probability scales with distance from the centre (centerSparsity
and edgeDensity), so density rises toward the edges and the
middle stays open.
- Two patterns are built once at module load:
ASCII_MIST — 180x80 grid of punctuation glyphs
(· . : , ; - _ = / < > ( ) [ ] { } |)
at very low alpha (rgba 0.05).
ASCII_STARS — same grid dimensions, very sparse,
drawn from a brighter charset
(0 1 + * ✦ ░ ▒) at higher alpha (0.13).
- <AsciiBackdrop /> stacks both layers as <pre> blocks with the
correct font-family, line-height, and letter-spacing. A
radial-gradient mask fades both layers toward a configurable
centre point (maskAt prop) so foreground text stays crisp.
A single CSS keyframe (rfn-ascii-breath, 9s ease-in-out) lifts
the opacity slightly; the two layers run with offset delays so
they never breathe in lockstep.
Placement:
- Hero — maskAt="32% 50%" so the soft centre falls under the
headline column on the left, ASCII fills the right.
- "Why I'm building" letter card — maskAt="35% 55%", same idea,
ASCII surrounds the letter text without smothering it.
DotGridBackdrop is still the default everywhere else. Pure CSS,
no SVG, no canvas, no runtime regeneration after mount.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…section
Built a second ASCII backdrop that's figurative rather than
ambient scatter — two tapering "arm" silhouettes that sweep in
from opposite corners and almost touch in the centre (the
Creation-of-Adam composition, the spark gap left intact).
Generator (deterministic, module-level):
HandBlade type — origin (ax,ay), tip (bx,by), thickStart,
thickEnd. Coordinates are in screen units;
y is multiplied by 2 at sample time to
compensate for monospace char aspect.
HAND_BLADES — two blades:
1) ax=-8, ay=78 → bx=78, by=46 (left arm, lower-left ⇒
fingertip just left of centre)
2) ax=168, ay=22 → bx=84, by=50 (right arm, upper-right ⇒
fingertip just right of centre)
Both taper from thickStart=9.5 at the wrist to thickEnd=0.6
at the fingertip.
bladeSD(c, r, b) — signed distance from (c, r*2) to the blade's
spine minus its lerped thickness. Negative
inside the blade, positive outside.
For each cell I take the min SD over the two blades and bin it
into a density palette:
sd < -4 → ▓ (deep inside)
sd < -2 → ▓/▒ random (transition band)
sd < -0.5 → ▒
sd < 0.4 → ░ (edge)
sd < 1.5 → · or space (stray fringe)
else → space
Final pattern is 160 cols × 48 rows, baked once into
HANDS_PATTERN. The seeded LCG keeps it stable across renders.
<HandsAsciiBackdrop /> renders the pattern as a single <pre>
(font-size 13px, line-height 1.05, letter-spacing 0.06em, alpha
0.075). Radial mask peaks at the middle and fades to transparent
at the corners so it never fights with sectionFades.
Placed on the Founder + Origin Story section — the "hands
reaching, almost touching" metaphor lands well alongside the
hackathon-moment narrative without needing explanation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ll.txt
LLM/GenAI discoverability infrastructure. Three concrete changes:
- public/robots.txt: add an explicit AI-crawler block at the top
of the file, ahead of the existing search-engine rules. Two
groups, both with Allow: /
• Retrieval bots (live AI search): OAI-SearchBot, ChatGPT-User,
Claude-SearchBot, Claude-Web, PerplexityBot, Perplexity-User,
Applebot-Extended, YouBot.
• Training bots (long-term LLM memory): GPTBot, ClaudeBot,
anthropic-ai, Google-Extended, Meta-ExternalAgent, CCBot,
Bytespider, cohere-ai, cohere-training-data-crawler, Diffbot,
FacebookBot.
Refactron's goal is to be both indexed for live AI answers AND
remembered in foundation models, so both groups are explicitly
allowed (no more commented-out / allowed-by-default ambiguity).
Also added Sitemap: line for /llms.txt alongside /sitemap.xml.
- public/llms.txt: new, hand-curated markdown site map per the
llmstxt.org spec — H1 + blockquote positioning + Docs/Examples/
Optional sections. Read by AI IDEs (Cursor, Claude Code, Windsurf)
when a user points them at refactron.dev, and increasingly by AI
search retrievers.
- public/llms-full.txt: new, auto-generated full LLM-ingestion doc.
Concatenates (a) curated product overview + safety constraints +
comparison table, (b) the origin story, (c) all FAQs from
FAQSection.tsx, (d) every blog post (title + summary + full body)
from posts.ts. ~56 KB, 872 lines, regenerates on every build.
- scripts/generate-llms-full.js: the generator. Mirrors the
pattern of scripts/generate-sitemap.js — regex parsing of
posts.ts and FAQSection.tsx, no ts-node required.
- package.json: prebuild now runs sitemap + llms-full back-to-back
so the two stay in sync on every build.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…Application schema
LLM-targeted copy and structured data updates on the landing page.
Meta:
- <meta name="description"> rewritten to lead with the phrases
LLM users actually search for: "deterministic", "behavior-
preserving", "no LLM in the loop", "verified before every
write", "runs locally". ≤160 chars.
- <meta name="keywords"> expanded to cover the high-intent LLM
query phrases: "deterministic refactoring",
"no-LLM code refactoring tool", "behavior-preserving",
"legacy code modernization", "local-first developer tools".
- og:description and twitter:description mirror the new meta
description (same primary positioning across SERP previews).
Structured data (script type=application/ld+json):
- SoftwareApplication: programmingLanguage promoted to an array
(Python, TypeScript, JavaScript), softwareVersion added,
free-tier Offer added, and a featureList of the seven core
capabilities — each phrased as a fact AI assistants can quote.
- NEW FAQPage block sourced from the six entries in
src/components/FAQSection.tsx (does Refactron change code
automatically / how is it safe / production-ready / where
does code go / supported languages / open-source). FAQPage
is the single highest-impact JSON-LD type for AI-assistant
quoting in 2026.
application/ld+json blocks now = 4 (Organization, WebSite,
SoftwareApplication, FAQPage). Pre-render integrity preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ders
BlogPostPage:
- Wired the existing useSEO hook so each post page sets its own
<title>, meta description, keywords, canonical, og:title/desc,
and twitter:title/desc from the matched post data. Falls back
to a neutral "Post not found" set when slug doesn't resolve.
- New useBlogPostingSchema hook: on mount it injects a
<script type="application/ld+json"> BlogPosting block into
<head> with headline, description, datePublished (ISO),
author (Person with profile link), publisher (Organization
with logo), mainEntityOfPage, url, keywords, inLanguage.
Removes the script on unmount so navigation between posts
keeps exactly one BlogPosting block live.
vercel.json:
- New header rules for /llms.txt and /llms-full.txt mirroring
the /sitemap.xml config:
Content-Type: text/markdown; charset=utf-8
Cache-Control: public, max-age=86400, stale-while-revalidate=43200
X-Robots-Tag: all
The X-Robots-Tag is the explicit signal to retrieval bots that
these files are fair game.
End-to-end result: every blog post now ships with rich Article-
level structured data; both LLM index files are served with the
correct content type and a 24h cache.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59a9566 to
0983448
Compare
No description provided.